package thread.interrupt;
/*
Aim:
验证1: 线程处于阻塞状态，调用该线程的interrupt后，线程会跳出阻塞状态，清除阻塞状态，并生成InterruptedException，
从而进入异常处理块中。
*/
public class BlockThenInterrupt extends Thread {
    public static void main(String args[]) throws Exception {  
        BlockThenInterrupt thread = new BlockThenInterrupt();
        System.out.println("Starting thread...");  
        thread.start();  
        Thread.sleep(3000);  
        System.out.println("Asking thread to stop...");  
        thread.interrupt();// 等中断信号量设置后再调用  
        Thread.sleep(5000);  
        System.out.println("Stopping application...");  
    }  
  
    public void run() {  
        while (!Thread.currentThread().isInterrupted()) {  
            System.out.println("Thread running...");  
            try {  
                /* 
                 * 如果线程阻塞，将不会去检查中断信号量stop变量，即不会检查上面的while循环条件，
                 * 而条用thread.interrupt() 会使阻塞线程从阻塞的地方抛出异常，让阻塞线程从阻塞状态逃离出来，并
                 * 进行异常块进行 相应的处理 
                 */  
                Thread.sleep(1000);// 线程阻塞，如果线程收到中断操作信号将抛出异常
            } catch (InterruptedException e) {  
                System.out.println("In catch block code, Thread interrupted...");
                /* 
                 * 如果线程在调用 Object.wait()方法，或者该类的 join() 、sleep()方法 
                 * 过程中受阻，则其中断状态将被清除 
                 */  
                System.out.println("判断阻塞状态被中断后，中断状态是否被清除： "+this.isInterrupted());// false
  
                //是否结束该线程由自己决定，如果需要真真中断线程，则需要重新设置中断位，如果
                //不需要，则不用调用  
                Thread.currentThread().interrupt();  
            }  
        }  
        System.out.println("Thread exiting under request...");  
    }  
}  